package ejb.metrica.seguridad.control;

import ejb.metrica.seguridad.dao.CuentaUausrioDAO;
import ejb.metrica.seguridad.dao.RolesDAO;
import ejb.metrica.seguridad.dao.UsuarioDAO;
import ejb.metrica.seguridad.entity.BusquedaDTO;
import ejb.metrica.seguridad.entity.CuentausuarioDTO;
//import ejb.metrica.seguridad.entity.HistoriacuentasDTO;
import ejb.metrica.seguridad.entity.RolesDTO;
import ejb.metrica.seguridad.entity.UsuarioDTO;
import ig.metrica.aplicacion.AplicacionDAO;
import ig.metrica.aplicacion.AplicacionDTO;
import ig.metrica.aplicacion.AplicacionMetricaDTO;
import ig.util.KeyGenerator;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Hashtable;
import java.util.Vector;
import java.util.logging.Level;

/**
 * This is the bean class for the CuentaUsuarioControlBean enterprise bean.
 * Created 15/05/2006 03:29:23 PM
 * @author jsanchez
 */
public class CuentaUsuarioControlBean implements CuentaUsuarioControlRemoteBusiness, CuentaUsuarioControlLocalBusiness {


    /**
     * @see javax.ejb.SessionBean#ejbActivate()
     */
    public void ejbActivate() {
    }

    /**
     * @see javax.ejb.SessionBean#ejbPassivate()
     */
    public void ejbPassivate() {
    }

    /**
     * @see javax.ejb.SessionBean#ejbRemove()
     */
    public void ejbRemove() {
    }
    // </editor-fold>
    /**
     * See section 7.10.3 of the EJB 2.0 specification
     * See section 7.11.3 of the EJB 2.1 specification
     */
    public void ejbCreate() {
        //System.out.println("SER CREA EL SESSIO");
        // TODO implement ejbCreate if necessary, acquire resources
        // This method has access to the JNDI context so resource aquisition
        // spanning all methods can be performed here such as home interfaces
        // and data sources.
    }
    private CuentausuarioDTO cuentausuarioDTO = null;
    private UsuarioDTO usuarioDTO = null;
//    private HistoriacuentasDTO historiacuentasDTO =null;
    private RolesDTO rolesDTO = null;

    private void validarRol() {
//        System.out.println(context.isCallerInRole("jsanchez"));
//        System.out.println(context.isCallerInRole("admin"));
    }
    // Add business logic below. (Right-click in editor and choose
    // "EJB Methods > Add Business Method" or "Web Service > Add Operation")
    public Integer crear(java.util.Collection CDTO) {
        this.instanceofCollection(CDTO);
        return this.crear();
    }

    public Boolean modificar(java.util.Collection CDTO) {
        instanceofCollection(CDTO);
        return this.modificar();
    }

    private void instanceofCollection(java.util.Collection CDTO) {
        cuentausuarioDTO = null;
        usuarioDTO = null;
//        historiacuentasDTO =null;
        //TODO implement crear
        for (Object elem : CDTO) {
            if (elem instanceof CuentausuarioDTO) {
                cuentausuarioDTO = (CuentausuarioDTO) elem;
            } else if (elem instanceof UsuarioDTO) {
                usuarioDTO = (UsuarioDTO) elem;
            /*}else if(elem instanceof HistoriacuentasDTO){
            historiacuentasDTO=(HistoriacuentasDTO) elem;*/
            } else if (elem instanceof RolesDTO) {
                rolesDTO = (RolesDTO) elem;
            }
        }
    }
//    private UsuarioLocal usuarioLocal=null;
//    private RolesLocal rolesLocal=null;
//    private CuentausuarioLocal cuentausuarioLocal=null;
    private Integer crear() {        
        UsuarioDAO usuarioDAO = new UsuarioDAO();
        CuentaUausrioDAO cuentaUausrioDAO = new CuentaUausrioDAO();
        RolesDAO rolesDAO = new RolesDAO();
        try {
            if (usuarioDTO != null && this.getNombreSession(usuarioDTO.getID()) != null) {
                System.out.println("Intentando crear un nuevo usuario :"+usuarioDTO);
                if (usuarioDTO != null && usuarioDTO.getId() == null) {
                    usuarioDTO.setId(usuarioDAO.guardar(usuarioDTO));
                }
                Collection c = (Collection) cuentaUausrioDAO.buscarPorUsuario(cuentausuarioDTO.getUsuario().trim());
                if (cuentausuarioDTO != null && c.size() == 0) {
                    System.out.println("Intentando crear una nueva cuenta de usuario :"+cuentausuarioDTO);
                    cuentausuarioDTO.setTipoRol(this.rolesDTO.getId());
                    cuentausuarioDTO.setIdUsuario(this.usuarioDTO.getId());
                    return cuentaUausrioDAO.guardar(cuentausuarioDTO);
                } else {
                    return -1;
                }
            } else if (this.rolesDTO != null) {
                if (this.rolesDTO.getDescripcion() != null && this.rolesDTO.getNombre() != null) {
                    System.out.println("Con Rol de :"+rolesDTO);
                    return rolesDAO.guardar(this.rolesDTO);
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }

    private Boolean modificar() {

        UsuarioDAO usuarioDAO = new UsuarioDAO();
        CuentaUausrioDAO cuentaUausrioDAO = new CuentaUausrioDAO();
        RolesDAO rolesDAO = new RolesDAO();

        try {
            if (usuarioDTO != null && this.getNombreSession(usuarioDTO.getID()) != null) {
                Integer idUsuario = usuarioDAO.guardar(usuarioDTO);
                Collection c = (Collection) cuentaUausrioDAO.buscarPorUsuario(cuentausuarioDTO.getUsuario().trim());
                for (Object elem : c) {
                    if (!((CuentausuarioDTO) elem).getId().equals(cuentausuarioDTO.getId())) {
                        return null;
                    }
                }
                cuentausuarioDTO.setCuenta(cuentausuarioDTO.getCuenta());
                cuentausuarioDTO.setUsuario(cuentausuarioDTO.getUsuario());
                cuentausuarioDTO.setTipoRol(rolesDTO.getId());
                cuentausuarioDTO.setIdUsuario(idUsuario);
                cuentaUausrioDAO.guardar(cuentausuarioDTO);
                return true;
            } else if (this.rolesDTO != null) {
                if (this.rolesDTO.getDescripcion() != null && this.rolesDTO.getNombre() != null) {
                    rolesDAO.guardar(this.rolesDTO);
                }
            }
            return false;
        } catch (Exception ex) {
            ex.printStackTrace();
            return false;
        }
    }

    public Boolean eliminarUsuario(java.lang.Integer idUsuario, LoginDTO login) {
        UsuarioDAO usuarioDAO = new UsuarioDAO();
        CuentaUausrioDAO cuentaUausrioDAO = new CuentaUausrioDAO();
        try {
            if (login != null && this.getNombreSession(login.getID()) != null) {
                Collection c = cuentaUausrioDAO.buscarTodos();
                for (Object elem : c) {
                    if (((CuentausuarioDTO) elem).getIdUsuario().equals(idUsuario)) {
                        cuentaUausrioDAO.eliminar(((CuentausuarioDTO) elem).getId());
                    }
                }
                usuarioDAO.eliminar(idUsuario);
                return true;
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return false;
    }

    private String getNombreSession(Long ID) {
        return "valido";
        /*if (this.sessiones.get(ID) != null) {
            return this.sessiones.get(ID);
        } else {
            return null;
        }*/
    }

    public Boolean eliminarCuenta(java.lang.Integer idCuentaUsuario, LoginDTO login) {
        UsuarioDAO usuarioDAO = new UsuarioDAO();
        CuentaUausrioDAO cuentaUausrioDAO = new CuentaUausrioDAO();
        try {
            if (login != null && this.getNombreSession(login.getID()) != null) {
                Collection c = cuentaUausrioDAO.buscarTodos();
                int count = 0;
                int id = -1;
                for (Object elem : c) {
                    if (((CuentausuarioDTO) elem).getIdUsuario().equals(idCuentaUsuario)) {
                        count++;
                        id = ((CuentausuarioDTO) elem).getIdUsuario();
                    }
                }
                cuentaUausrioDAO.eliminar(idCuentaUsuario);
                if (count == 1) {
                    usuarioDAO.eliminar(id);
                }
                return true;
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return false;
    }

    public Object validarCuenta(java.lang.Object obj) {

        AplicacionDAO aplicacionDAO = new AplicacionDAO();
        
        AplicacionDTO aplicacionQueLlegaDTO = new AplicacionDTO();
        aplicacionQueLlegaDTO.setVersion(((CuentausuarioDTO) obj).getVersionAplicacion());
        
        CuentaUausrioDAO cuentaUausrioDAO = new CuentaUausrioDAO();
        RolesDAO rolesDAO = new RolesDAO();
        try {
            
            AplicacionDTO aplicacionDTO = aplicacionDAO.findByPk(new AplicacionMetricaDTO());
            
            if( aplicacionDTO==null ){
                aplicacionDTO=new AplicacionMetricaDTO();
                aplicacionDTO.setVersion(((CuentausuarioDTO) obj).getVersionAplicacion());
                aplicacionDAO.create( aplicacionDTO );
            }
            
            if( aplicacionQueLlegaDTO.getIntVersion() < aplicacionDTO.getIntVersion() ) {
                return "Servidor: "+aplicacionDTO.getVersion()+", Cliente: " + aplicacionQueLlegaDTO.getVersion();
            }else if( aplicacionQueLlegaDTO.getIntVersion() > aplicacionDTO.getIntVersion() ) {
                aplicacionDTO.setVersion( aplicacionQueLlegaDTO.getVersion() );
                aplicacionDAO.update( aplicacionDTO );
            }
            
            
            
            validarRol();
            //Collection CCU=this.lookupCuentausuarioBean().findByUsuario(((CuentausuarioDTO)obj).getUsuario());
            Collection CCU = (Collection) cuentaUausrioDAO.buscarPorUsuario(((CuentausuarioDTO) obj).getUsuario());
            for (Object elem : CCU) {
                if (((CuentausuarioDTO) elem).getCuenta().equals(((CuentausuarioDTO) obj).getCuenta())) {
                    CuentausuarioDTO _cuentausuarioDTO = (CuentausuarioDTO) cuentaUausrioDAO.buscar(((CuentausuarioDTO) elem).getId());
                    //CuentausuarioLocal cul=this.lookupCuentausuarioBean().findByPrimaryKey(((CuentausuarioLocal)elem).getId());
                    RolesDTO _rolesDTO = (RolesDTO) rolesDAO.buscar(_cuentausuarioDTO.getTipoRol());
//                    RolesLocal roleslocal= this.lookupRolesBean().findByPrimaryKey(
//                            this.lookupCuentausuarioBean().findByPrimaryKey(
//                                ((CuentausuarioLocal)elem).getId()
//                                ).getTiporol().getId()
//                            );

//                    RolesDTO roles= new RolesDTO(roleslocal.getId(),roleslocal.getNombre(),roleslocal.getDescripcion(),roleslocal.getOpciones());

                    //Generamos un id unico
                    Long ID = KeyGenerator.getInstance().getNewKey().longValue();

                    sessiones.put(ID, _cuentausuarioDTO.getUsuario());
                    //System.out.println("ID:"+ID+"-Usuario:"+cul.getUsuario());
                    _rolesDTO.setID(ID);
                    _rolesDTO.setUSUARIO(_cuentausuarioDTO.getUsuario());
                    return _rolesDTO;
                }
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (Throwable ex) {
            ex.printStackTrace();
        }
        return Boolean.FALSE;
    }
    Hashtable<Object, String> sessiones = new Hashtable<Object, String>();

    public boolean desconectar(java.lang.Object object) {
        if (this.getNombreSession(((LoginDTO) object).getID()) != null) {
            if (this.sessiones.get(((LoginDTO) object).getID()) != null && this.sessiones.get(((LoginDTO) object).getID()).equals(((LoginDTO) object).getUSUARIO())) {
                this.sessiones.remove(((LoginDTO) object).getID());
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
    //LA COENXION CON LOS BEANS
//    private cliente.ServiceLocator serviceLocator;
//    
//    private cliente.ServiceLocator getServiceLocator() {
//        if (serviceLocator == null) {
//            serviceLocator = new cliente.ServiceLocator();
//        }
//        return serviceLocator;
//    }
//    
//    private ejb.metrica.seguridad.entity.UsuarioLocalHome lookupUsuarioBean() {
//        try {
//            return (ejb.metrica.seguridad.entity.UsuarioLocalHome) getServiceLocator().getLocalHome("java:comp/env/ejb/UsuarioBean");
//        } catch(javax.naming.NamingException ne) {
//            java.util.logging.Logger.getLogger(getClass().getName()).log(java.util.logging.Level.SEVERE,"exception caught" ,ne);
//            throw new RuntimeException(ne);
//        }
//    }
//    
//    private ejb.metrica.seguridad.entity.CuentausuarioLocalHome lookupCuentausuarioBean() {
//        try {
//            return (ejb.metrica.seguridad.entity.CuentausuarioLocalHome) getServiceLocator().getLocalHome("java:comp/env/ejb/CuentausuarioBean");
//        } catch(javax.naming.NamingException ne) {
//            java.util.logging.Logger.getLogger(getClass().getName()).log(java.util.logging.Level.SEVERE,"exception caught" ,ne);
//            throw new RuntimeException(ne);
//        }
//    }
//    
//    private ejb.metrica.seguridad.entity.HistoriacuentasLocalHome lookupHistoriacuentasBean() {
//        try {
//            return (ejb.metrica.seguridad.entity.HistoriacuentasLocalHome) getServiceLocator().getLocalHome("java:comp/env/ejb/HistoriacuentasBean");
//        } catch(javax.naming.NamingException ne) {
//            java.util.logging.Logger.getLogger(getClass().getName()).log(java.util.logging.Level.SEVERE,"exception caught" ,ne);
//            throw new RuntimeException(ne);
//        }
//    }
//    
//    private ejb.metrica.seguridad.entity.RolesLocalHome lookupRolesBean() {
//        try {
//            return (ejb.metrica.seguridad.entity.RolesLocalHome) getServiceLocator().getLocalHome("java:comp/env/ejb/RolesBean");
//        } catch(javax.naming.NamingException ne) {
//            java.util.logging.Logger.getLogger(getClass().getName()).log(java.util.logging.Level.SEVERE,"exception caught" ,ne);
//            throw new RuntimeException(ne);
//        }
//    }
    public Collection findAllCuentas(LoginDTO login) {
        UsuarioDAO usuarioDAO = new UsuarioDAO();
        CuentaUausrioDAO cuentaUausrioDAO = new CuentaUausrioDAO();
        RolesDAO rolesDAO = new RolesDAO();
        try {
            if (login != null && this.getNombreSession(login.getID()) != null) {
                Collection<BusquedaDTO> CBuscar = new Vector<BusquedaDTO>();

                Collection CCuentaUsuarios = cuentaUausrioDAO.buscarTodos();
//                Collection CUsuarios=usuarioDAO.buscarTodos();

//                boolean encontrado=false;
                for (Object elem : CCuentaUsuarios) {
                    BusquedaDTO busquedaDTO = new BusquedaDTO();
                    busquedaDTO.setId(((CuentausuarioDTO) elem).getId());
                    busquedaDTO.setRol(((RolesDTO) rolesDAO.buscar(((CuentausuarioDTO) elem).getTipoRol())).getNombre());
                    busquedaDTO.setUsuario(((CuentausuarioDTO) elem).getUsuario());
                    busquedaDTO.setApellidos(((UsuarioDTO) usuarioDAO.buscar(((CuentausuarioDTO) elem).getIdUsuario())).getApellidos());
                    busquedaDTO.setNomres(((UsuarioDTO) usuarioDAO.buscar(((CuentausuarioDTO) elem).getIdUsuario())).getNomres());
                    CBuscar.add(busquedaDTO);
                }
                return CBuscar;
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }

    public Collection findAllByPrimaruKey(java.lang.Integer Id, LoginDTO login) {
        UsuarioDAO usuarioDAO = new UsuarioDAO();
        CuentaUausrioDAO cuentaUausrioDAO = new CuentaUausrioDAO();
        RolesDAO rolesDAO = new RolesDAO();
        //UsuarioLocal usuarioLocal=null;
//        CuentausuarioDTO cuentausuarioDTO=new CuentausuarioDTO();
//        UsuarioDTO _usuarioDTO  = new UsuarioDTO();
//        RolesDTO _rolesDTO= new RolesDTO();
        Collection CBuscar = new Vector();
//        Collection CHistorias=null;
        //Integer idusuario=0;
        try {
            if (login != null && this.getNombreSession(login.getID()) != null) {
                //Buscamos la cuenta a sociada al ID enviado como parametro
//                CuentausuarioLocal cuentausuarioLocal=this.lookupCuentausuarioBean().findByPrimaryKey(Id);

                CuentausuarioDTO cuentausuarioDTO1 = (CuentausuarioDTO) cuentaUausrioDAO.buscar(Id);
//              cuentausuarioDTO.setId(cuentausuarioLocal.getId());
//              cuentausuarioDTO.setCuenta(cuentausuarioLocal.getCuenta());
//              cuentausuarioDTO.setUsuario(cuentausuarioLocal.getUsuario());
                CBuscar.add(cuentausuarioDTO1);

                //Buscamos el usuario asociado a la cuenta
                //UsuarioLocal usuarioLocal=this.lookupUsuarioBean().findByPrimaryKey(cuentausuarioLocal.getIdUsuario().getId());
                //usuarioDTO.setApellidos(usuarioLocal.getApellidos());
                //usuarioDTO.setId(usuarioLocal.getId());
                //usuarioDTO.setNomres(usuarioLocal.getNomres());

                CBuscar.add(usuarioDAO.buscar(cuentausuarioDTO1.getIdUsuario()));

                //Buscamos el Rols asociado a la cuenta
                //RolesLocal rolesLocal=this.lookupRolesBean().findByPrimaryKey(cuentausuarioLocal.getTiporol().getId());
                //rolesDTO.setDescripcion(rolesLocal.getDescripcion());
                //rolesDTO.setId(rolesLocal.getId());
                //rolesDTO.setNombre(rolesLocal.getNombre());

                CBuscar.add(rolesDAO.buscar(cuentausuarioDTO1.getTipoRol()));


                //Busco todos los Roles
                CBuscar.add(this.findAllRoles(login));

                //Busco todas la historias relacionadas con la cuenta
                CBuscar.add(new ArrayList()/*this.findHistoriasCambiosById(cuentausuarioLocal.getId(),login)*/);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }

        return CBuscar;

    }

    public Collection findAllRoles(LoginDTO login) {
        try {
            RolesDAO rolesDAO = new RolesDAO();
            if (login != null && this.getNombreSession(login.getID()) != null) {
                return rolesDAO.buscarTodos();
//                Collection CRolesDTO=new Vector();
//                Collection CRoles= this.lookupRolesBean().findByAll();
//                for (Object elem : CRoles) {
//                    RolesDTO rolesDTO= new RolesDTO();
//                    rolesDTO.setId(((RolesLocal)elem).getId());
//                    rolesDTO.setDescripcion(((RolesLocal)elem).getDescripcion());
//                    rolesDTO.setNombre(((RolesLocal)elem).getNombre());
//                    rolesDTO.setOpciones(((RolesLocal)elem).getOpciones());
//                    CRolesDTO.add(rolesDTO);
//                }
//                return CRolesDTO;
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }
//    private Collection findHistoriasCambiosById(Integer idUsuario,LoginDTO login) {
//        try {
//            if(login!=null && this.getNombreSession(login.getID())!=null){
//                //System.out.println("entra a buscar las historias");
//                Collection CHistoriasDTO=new Vector();
//                return CHistoriasDTO;
////                Collection CRoles= this.lookupHistoriacuentasBean().findByAll();
////                HistoriacuentasLocal historiacuentasLocal=null;
////                for (Object elem : CRoles) {
////                    //historiacuentasLocal=this.lookupHistoriacuentasBean().findByPrimaryKey(((HistoriacuentasLocal)elem).getId());
////                    historiacuentasLocal=(HistoriacuentasLocal) elem;
////                    //System.out.println(historiacuentasLocal.getId());
////                    if(historiacuentasLocal.getIdCuentausuario().getId().equals(idUsuario)){
////                        //        System.out.println("encuantra");
////                        HistoriacuentasDTO historiacuentasDTO= new HistoriacuentasDTO();
////                        historiacuentasDTO.setId(historiacuentasLocal.getId());
////                        historiacuentasDTO.setCuentaanterior(historiacuentasLocal.getCuentaanterior());
////                        historiacuentasDTO.setFechacreacion(historiacuentasLocal.getFechacreacion());
////                        historiacuentasDTO.setUsuariocreo(historiacuentasLocal.getUsuariocreo());
////                        CHistoriasDTO.add(historiacuentasDTO);
////                    }
////                }
////                return CHistoriasDTO;
//            }
//        } catch (Exception ex) {
//            ex.printStackTrace();
//        }
//        return null;
//        //System.out.println();
//    }
    public Collection findHistoriasByIdCuentausuario(java.lang.Integer idCuentausuario, LoginDTO login) {
        if (login != null && this.getNombreSession(login.getID()) != null) {
            return new ArrayList();//this.findHistoriasCambiosById(idCuentausuario,login);
        } else {
            return null;
        }
    }

    public void crear(ejb.metrica.seguridad.entity.RolesDTO DTO) {
        try {
            RolesDAO rolesDAO = new RolesDAO();
            rolesDAO.guardar(DTO);
        //this.lookupRolesBean().create(KeyGenerator.getInstance().getNewKey(),DTO.getNombre(),DTO.getDescripcion(),DTO.getOpciones());
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public Boolean eliminarRol(java.lang.Integer idRol, LoginDTO login) {
        try {
            RolesDAO rolesDAO = new RolesDAO();
            CuentaUausrioDAO cuentaUausrioDAO = new CuentaUausrioDAO();
            if (login != null && this.getNombreSession(login.getID()) != null) {
                Collection c = cuentaUausrioDAO.buscarTodos();
                for (Object elem : c) {
                    int idLocal = ((CuentausuarioDTO) elem).getTipoRol().intValue();
                    if (idLocal == idRol) {
                        throw new Exception("");
                    }
                }
                rolesDAO.eliminar(idRol);
                return true;
            } else {
                return false;
            }
        } catch (Exception ex) {
            return null;
        //ex.printStackTrace();
        }
    }
}
